說起來會開這一章真的是我很想分享一些後端的資訊安全常識。
在Backend的洗禮下,學習了蠻多的東西。
希望能一一分享給大家。
這邊在此著名一下,這邊引用了Triton Ho 「安全」的常識的文章。
並且也有部分是直接複製文中的敘述,在文章中就不一一附註。
我忘記了網站的密碼,當我使用忘記密碼後……
系統居然把你的密碼寄回給你!!
然後很多人還覺得:『不存明碼……很危險,要是發生什麼就不能登入了……』
還有『我把資料庫的用戶密碼做加密就好。』
這類的的想法……我實在是不知道怎麼說了。
這就有趣了,我們必須思考一下安全是什麼。
在這之前我來說一個故事好了。
在同一個實驗室中,我的學長快要畢業了。
他跑過來跟我聊天……
學長:「學弟,這台電腦裡面東西都很重要。」
我:「喔喔,我知道了。」
我繼續用電腦,學長突然拍了拍我。
學長:「學弟!你怎麼把防毒軟體移除了!」
我:「嗯?阿,因為電腦太卡了。」
學長:「學弟!你都不怕駭客攻擊喔!裡面東西都很重要!」
我:「可是學長……也不需要安裝到4套防毒吧。」
學長:「學弟,你不懂,現在駭客…………」
先不說駭客多厲害,但我想問學長:
我:「那什麼東西很重要?」
學長:「我們以前修改的程式碼,很重要。」
我:「那東西……是多重要,商業還是研究?」
學長:「就……修改課本裡面的程式碼。」
我:「………」
駭客真的有那麼閑嗎?
這就要說到『安全的常識』了。
我們思考一下,怎樣的人會很不安全:
很簡單,就是就是「犯案成本」比「犯案後得到的利益」更低。
以一般普通的個人來說就是:
不裝不必要的軟體。
少裝軟體就少了軟體的Bug引起的安全缺口。
那麼簡單,總之就是減少入侵的手段來提高駭客的作案成本。
不過我是developer而不是資安專家,只能聽大神們說的,然後整理而已。
說真的……駭客也要吃飯,會修改別人的網站首頁
好……說回來,接下來我們來談談常識吧~
現在的人都有超過1個不同的系統帳戶。
很多人又很懶加上不擅長寄一堆奇怪的密碼,因此……
而大家的密碼會重複使用。
所以當這個系統沒什麼能偷,但系統要是有可還原的用戶密碼,駭客得到了某客戶的密碼,就有可能用這組帳密來登入其他的網站。
只要你存放了可還原的用戶密碼,就會增加駭客獲利的可能。
為何上傳密碼時要用POST Body不能用GET的?
同理『為何不要使用encrypted完後放資料庫』?:
總之就是就是要讓密碼無法重現。
這就要提到Hash的幾個特性:
要是自己發的,要是沒有經過長時間的驗證很容易:
看光光你的source code,知道你的Hash算法。
簡單的一個例子:Hash(x) = (x mod 10)
這是為什麼MD5為何今天已經不安全,因為可以偽造重複。
現在用戶在資料庫中只有Hash過的資料。
很好,那駭客今天使用了『彩虹表』得到一大堆Hash摘要。
只要這用戶數目夠多,那我就能在你的資料庫中比對出相同的Hash摘要。
而『加鹽』就是這個意思,就是每一用戶的密碼基礎上,都加入不同的一段亂數。
然後把這個亂數存到用戶的紀錄上,這時一個彩虹表必需要加入這一段亂數來跑。
大大增加了破解的成本。
做加鹽很好,但如果Hash很快的話……那成本也不是很高。
SHA大家都知道了,是為了快速和大檔案而開發出來的。
理想的密碼用Hash應該是要讓CPU和RAM很慢。
跑一個密碼的Hash要花上1秒鐘,那你的彩虹表除了不能直接用,而加入亂數後跑,必需要花上極大的時間。
以下這些都是專門來做密碼Hash的:
目前我個人推薦,或者說大部分的人推薦的是『Argon2id』。
這邊有Argon2的論文:
這邊是WiKi:
Argon2會幫你做Hash跟Salting,而且夠慢,CPU類的加速都沒辦法使其變快。
Bcrypt這邊也有一篇文章:
Bcrypt: Choosing a Work Factor
這一篇不知道是很水還是很不錯。
但我還是把一些東西介紹了一下,除了常識之外大家請一定要好好的對待客戶的密碼。
很多的大老們都會注意這個部分,但目前很多公司還是沒有去處理。
有機會的話來說說Argon2、BCrypt、PBKDF2這三個,但那就是後話了。
這一次因為篇幅的關係跟密碼學其他很重要的東西要說,就先在這邊挖個坑。
下一章就是Hash的最後一章了,HMAC。
一樣,大家明天見。
Bcrypt: Choosing a Work Factor